package com.raymond.thread.manager.bean;

import com.raymond.thread.manager.scheduled.BaseScheduledThread;
import lombok.EqualsAndHashCode;
import lombok.Getter;

/**
 * 线程定时管理bean
 *
 * @author :  raymond
 * @version :  V1.0
 * @date :  2020-09-12 17:01
 */
@EqualsAndHashCode(callSuper = true)
@Getter
public class ScheduledThreadDefinition extends BaseThreadDefinition {

    public ScheduledThreadDefinition(Class<? extends BaseScheduledThread> baseThread, String threadPoolName, String threadName, Strategy strategy,
                                     long initialDelay, long period) {
        this(baseThread, threadPoolName, threadName, strategy, initialDelay, period, 50, "");
    }

    public ScheduledThreadDefinition(Class<? extends BaseScheduledThread> baseThread, String threadPoolName, String threadName, Strategy strategy,
                                     long initialDelay, long period, int order, String corn) {
        super(baseThread, threadPoolName, threadName, order);
        this.strategy = strategy;
        this.initialDelay = initialDelay;
        this.period = period;
        this.corn = corn;
    }

    /**定时策略**/
    private Strategy strategy;
    /**
     * 第一次运行延迟时间
     */
    private long initialDelay;
    /**
     * 策略是AT_FIXED_RATE是周期时间
     * 策略是WITH_FIXED_DELAY是延迟时间
     */
    private long period;
    /**
     * CRON表达式
     */
    private String corn;



    public enum Strategy {
        /**
         * 周期性的执行 Runnable
         * 延迟时间以上一个任务开始时间开始计算eg：一个线程执行1s,周期为2s，那么它会在0,2,4,6...执行  一个线程执行4s,周期为2s，那么它会在0,4,8,12...执行
         */
        AT_FIXED_RATE,
        /**
         * 周期性的执行 Runnable
         * 延迟时间以上一个任务结束时间开始算。eg：一个线程执行1s,周期为2s,那么它会在0,3,6,9...执行
         */
        WITH_FIXED_DELAY
    }
}
